home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Utilities / GOCR / src / jconv.cc next >
C/C++ Source or Header  |  2000-05-21  |  4KB  |  112 lines

  1. /* OCR Mai99 JS */
  2. // PGM gray ASCII=P2 RAW=P5
  3. // PPM RGB  ASCII=P3 RAW=P6
  4. // PBM B/W  ASCII=P1 RAW=P4
  5. // ToDo: 
  6. //  - pbm-raw to pgm also for x!=0 (mod 8) 
  7. // v0.01 bug eliminated
  8. // v0.02 convert renamed into jconv because ImageMagick uses same name 
  9.  
  10. // #include <iostream.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <assert.h>
  14. #include "pnm.h"
  15. #include "pcx.h"
  16. #include "tga.h"
  17.  
  18. int str_eq(char *s1,char *s2){
  19.   int i;
  20.   for(i=0;i<100;i++){
  21.     if(s1[i]!=s2[i]) return 0;
  22.     if(s1[i]==0) return 1;
  23.   }
  24.   return 2;
  25. }
  26.  
  27. int test_suffix(char *nam,char *suffix){    // 1=ident 0=different
  28.   int i,j,k;
  29.   for(i=0;i<1000 &&    nam[i]!=0;i++);        // len nam
  30.   for(j=0;j<1000 && suffix[j]!=0;j++);        // len suffix
  31.   for(k=0;k<j;k++)if( nam[i-j+k]!=suffix[k] ) return 0;
  32.   return 1;
  33. }
  34.  
  35. void help(){
  36.   printf("jconv version Mai1999 JS (pnm-raw,pcx8,tga24)\n"
  37.     "use: jconv [options] ?infile.pnm? ?outfile.pgm? ?ox? ?oy? ?dx? ?dy?\n"
  38.     "options: -shrink -pbm -? -help\n"
  39.     "example: jconv -shrink -pbm font.pbm font.pbm 0 0 0 0\n");
  40.   exit(1);
  41. }
  42.  
  43. int main(int argn, char *argv[]){
  44.   char *inam,*onam;
  45.   pix bild; 
  46.   int ox,oy,dx,dy,x,y,i,vvv=0;
  47.  
  48.   // skip options
  49.   for(i=1;i<argn;i++){
  50.     if(argv[i][0]!='-') break;
  51.     if(str_eq(argv[i],"-?"))      help(); else
  52.     if(str_eq(argv[i],"-help"))   help(); else
  53.     if(str_eq(argv[i],"-shrink")) vvv|=2; else
  54.     if(str_eq(argv[i],"-pbm"))    vvv|=4; else
  55.     printf("unknown option: %s\n",argv[i]);
  56.   }
  57.  
  58.   if(argn-i!=6) help();
  59.   inam=argv[i++];     onam=argv[i++];
  60.   ox=atoi(argv[i++]); oy=atoi(argv[i++]);
  61.   dx=atoi(argv[i++]); dy=atoi(argv[i++]);
  62.   printf("# in=%s out=%s offs=%d,%d len=%d,%d vvv=%d\n",
  63.          inam,onam,ox,oy,dx,dy,vvv);
  64.  
  65.   // ----- read picture
  66.   if( test_suffix(inam,".pbm") ) readpgm(inam,&bild,1); else
  67.   if( test_suffix(inam,".pgm") ) readpgm(inam,&bild,1); else
  68.   if( test_suffix(inam,".ppm") ) readpgm(inam,&bild,1); else
  69.   if( test_suffix(inam,".pnm") ) readpgm(inam,&bild,1); else
  70.   if( test_suffix(inam,".pcx") ) readpcx(inam,&bild,1); else
  71.   if( test_suffix(inam,".tga") ) readtga(inam,&bild,((vvv>1)?0:1)); else
  72.   { printf("Error: unknown suffix"); exit(1); }
  73.   if(ox< 0 || ox>=bild.x) ox=0;
  74.   if(oy< 0 || ox>=bild.y) oy=0;
  75.   if(dx<=0 || ox+dx>bild.x) dx=bild.x-ox;
  76.   if(dy<=0 || oy+dy>bild.y) dy=bild.y-oy;
  77.   if((vvv&2)==2 && bild.bpp==1){    // -shrink
  78.     int x,y;
  79.     printf("# shrinking PGM:   offs=%d,%d len=%d,%d\n",ox,oy,dx,dy);
  80.     for(y=0;y<dy;y++){    // shrink upper border
  81.       for(x=0;x<dx;x++)if(bild.p[x+ox     +(y+oy)*bild.x]<127) break;
  82.       if(x<dx){ if(y>0)y--;oy+=y;dy-=y;break; }   }
  83.     for(y=0;y<dy;y++){    // shrink lower border
  84.       for(x=0;x<dx;x++)if(bild.p[ox+x+(oy+dy-y-1)*bild.x]<127) break;
  85.       if(x<dx){ if(y>0)y--;dy-=y;break; }    }
  86.     for(x=0;x<dx;x++){    // shrink left border
  87.       for(y=0;y<dy;y++)if(bild.p[x+ox     +(y+oy)*bild.x]<127) break;
  88.       if(y<dy){ if(x>0)x--;ox+=x;dx-=x;break; }    }
  89.     for(x=0;x<dx;x++){    // shrink right border
  90.       for(y=0;y<dy;y++)if(bild.p[ox+dx-x-1+(oy+y)*bild.x]<127) break;
  91.       if(y<dy){ if(x>0)x--;dx-=x;break; }    }
  92.   }
  93.   printf("# final dimension: offs=%d,%d len=%d,%d bpp=%d\n",
  94.          ox,oy,dx,dy,bild.bpp);
  95.  
  96.   // ---- new size
  97.   for(y=0;y<dy;y++)
  98.   for(x=0;x<dx;x++)
  99.   for(i=0;i< 3;i++) 
  100.   bild.p[i+bild.bpp*(x+dx*y)]=bild.p[i+bild.bpp*(x+ox+(y+oy)*bild.x)];
  101.   bild.x=dx;
  102.   bild.y=dy;
  103.   // ---- write internal picture of textsite 
  104.   printf("# write %s\n",onam);
  105.   if( test_suffix(onam,".pbm") )  writepbm(onam,bild); else
  106.   if( test_suffix(onam,".pgm") )  writepgm(onam,bild); else
  107.   if( test_suffix(onam,".ppm") )  writeppm(onam,bild); else
  108.   if( test_suffix(onam,".pnm") )  writepgm(onam,bild); else
  109.   { printf("Error: unknown suffix"); }
  110.   delete bild.p;
  111. }
  112.